#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "pinctrl.h"
#include "common_def.h"
#include "soc_osal.h"
#include "test_suite_log.h"
#include "systick.h"

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include <unistd.h>
#include "iot_pwm.h"
#include "iot_errno.h"
#include "iot_watchdog.h"
#include "../inc/sle_serve_all.h"
#include "../inc/iot_gpio_ex.h"

void reset(void)
{
    IoTGpioSetDir(BSP_SG92R, IOT_GPIO_DIR_OUT);      // 设置GPIO引脚方向为输出
    IoTGpioSetOutputVal(BSP_SG92R, IOT_GPIO_VALUE1); //设置GPIO引脚的输出电平值。
}
//输出20000微秒的脉冲信号(x微秒高电平,20000-x微秒低电平)
void SetAngle(unsigned int duty)
{
    unsigned int time = FREQ_TIME;
    uapi_systick_delay_us(duty);                     // 延迟duty微秒
    IoTGpioSetOutputVal(BSP_SG92R, IOT_GPIO_VALUE0);
    uapi_systick_delay_us(time - duty);               // 延迟剩余的时间
}

/* The steering gear is centered
 * 1、依据角度与脉冲的关系，设置高电平时间为1500微秒
 * 2、不断地发送信号，控制舵机居中
 */
void RegressMiddle(void)  //0°
{
    unsigned int angle = 1500;                // 高电平时间为1500微秒
    for (int i = 0; i < COUNT; i++) {
        SetAngle(angle);
    }
}

/* Turn 90 degrees to the right of the steering gear
 * 1、依据角度与脉冲的关系，设置高电平时间为500微秒
 * 2、不断地发送信号，控制舵机向右旋转90度
 */
/*  Steering gear turn right */

//关闭阀门截断水流
void EngineTurnRight(void)  //-90°
{
    unsigned int angle = 500;                   // 高电平时间为500微秒
    for (int i = 0; i < COUNT; i++) {
        SetAngle(angle);
    }
}

//打开阀门开通水流
void EngineTurnRight_half(void)  //-45°
{
    unsigned int angle = 1000;
    for (int i = 0; i < COUNT; i++) {
        SetAngle(angle);
    }
}

/* Turn 90 degrees to the left of the steering gear
 * 1、依据角度与脉冲的关系，设置高电平时间为2500微秒
 * 2、不断地发送信号，控制舵机向左旋转90度
 */
/* Steering gear turn left */

void EngineTurnLeft_half(void)  //45°
{
    unsigned int angle = 2000;
    for (int i = 0; i < COUNT; i++) {
        SetAngle(angle);
    }
}

void EngineTurnLeft(void)  //90°
{
    unsigned int angle = 2500;
    for (int i = 0; i < COUNT; i++) {
        SetAngle(angle);
    }
}


void Sg90Task(void) 
{
    osal_printk("start test sg90\r\n");

    //舵机转向轴向左转90°
    EngineTurnLeft_half();
    osDelay(200);//延时200毫秒
    osal_printk("Turn 90 degrees to the left of the steering gear\r\n");

    //舵机居中
    RegressMiddle();
    osDelay(200);
    osal_printk("Turn 0 degrees to the left of the steering gear\r\n");

    osDelay(200);
    osal_printk("The steering gear is centered");
}
